#define _CRT_SECURE_NO_WARNINGS 1
using namespace std;
#include<iostream>

#include<deque>
namespace Stack
{
	template<class T, class Con=deque<T>>
	// template<class T, class Con=vector<T>>
	// template<class T, class Con = list<T>>
	class stack
	{
	public:
		stack()
		{
			// ...
		}
		void push(const T& x)
		{
			_c.push_back(x);
		}
		void pop()
		{
			_c.pop_back();
		}
		T& top()
		{
			return _c.back();
		}
		const T& top() const
		{
			return _c.back();
		}
		size_t size() const
		{
			return _c.size();
		}
		bool empty() const
		{
			return _c.empty();
		}
	private:
		Con _c;
	};
}

int main()
{
	Stack::stack<int> st;
	st.push(10);
	st.push(20);
	st.push(30);
	st.push(40);
	st.push(50);
	cout << st.top() << endl;
	cout << st.size() << endl;
	st.pop();
	cout << st.top() << endl;
	cout << "Is stack empty? " << (st.empty() ? "Yes" : "No") << endl;
	while (!st.empty())
	{
		st.pop();
	}
	cout << "Is stack empty? " << (st.empty() ? "Yes" : "No") << endl;

	return 0;
}